package com.tiantang.shiro.helloworld.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @description：功能描述	自定义Realm，改realm需要实现shiro官方提供的Realm接口
 * @author： liujinkun	
 * 创建时间： 2018年1月17日
 * @version：1.0
 * Copyright (c) 2018年 京东方科技集团股份有限公司
 */
public class ShiroRealm extends AuthenticatingRealm{
	
	private static Logger logger=LoggerFactory.getLogger(ShiroRealm.class);

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		logger.info("============>>>> 进入第一个Realm");
		System.out.println("========>>>>>>>doAuthenticationInfo"+token);
		UsernamePasswordToken uToken=(UsernamePasswordToken)token;
		String username=uToken.getUsername();
		
		System.out.println("从数据中获取用户信息");
		if("unknown".equals(username)){
			throw new UnknownAccountException("用户不存在");
		}
		
		if("monster".equals(username)){
			throw new LockedAccountException("用户被锁定");
		}
		
		//根据用户的情况，来构建AuthenticationInfo 对象返回。通常使用的实现类为：SimpleAuthenticationInfo
		//principal 认证实体的信息，可以是username,也可以是数据表对应的用户的实体类对象
		Object principal=username;
		//credentials 密码（数据库查出的数据）
		Object credentials="0ea9114a57ee221805a9cd4f1ce40663";
		// realmName 当前realm对象的name
		String realmName=getName();
		logger.info("当前realm的name为"+realmName);
		
		//盐值
		ByteSource credentialsSalt=ByteSource.Util.bytes(username);
//		SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(principal, credentials, realmName);
		SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName);
		
		return info;
	}
	
}
